package com.xiaoq.coms.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class MathUtil {

	private static final double R = 6378137; // 地球半径

	private static double EARTH_RADIUS = 6378.137;

	/**
	 *  用于在mongodb中的地理位置运算
	 */
	public static final double METER_2_MONGO_DISTANCE = 1000.0 * 111;

	private static DecimalFormat df = new DecimalFormat("#.00"); //保留2为小数
	
	/**
	 * 
	 * @param long1 第一个点经度
	 * @param lat1  第一个点纬度
	 * @param long2 第二个点经度
	 * @param lat2 第二个点纬度
	 * @return 米
	 */
	public static double distance(Double long1, Double lat1, Double long2, Double lat2) {
		if(long1 == null || lat1==null || long2==null || lat2==null) {
			return 0.0D;
		}
		double a, b;
		lat1 = lat1 * Math.PI / 180.0;
		lat2 = lat2 * Math.PI / 180.0;
		a = lat1 - lat2;
		b = (long1 - long2) * Math.PI / 180.0;
		double d;
		double sa2, sb2;
		sa2 = Math.sin(a / 2.0);
		sb2 = Math.sin(b / 2.0);
		d = 2 * R * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1) * Math.cos(lat2) * sb2 * sb2));
		return d;
	}


	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}


	/**
	 * 通过经纬度获取距离(单位：米)
	 *
	 * @param lat1
	 * @param lng1
	 * @param lat2
	 * @param lng2
	 * @return 距离
	 */
	public static double getDistance(double lat1, double lng1, double lat2,
									 double lng2) {
		double radLat1 = rad(lat1);
		double radLat2 = rad(lat2);
		double a = radLat1 - radLat2;
		double b = rad(lng1) - rad(lng2);
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
				+ Math.cos(radLat1) * Math.cos(radLat2)
				* Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000d) / 10000d;
		s = s * 1000;
		return s;
	}




	/**
	 *  单位转换
	 *  小于 1000  返回 xx m(保留整数)
	 *  大于1000 返回 xx.xx km (保留2位)
	 * @param meter 米
	 * @return
	 */
	public static String distance(Double meter){
		if(meter == null){
			return "0m";
		}
		if(meter < 1000.0){
			return meter.intValue() + "m";
		}
		return df.format(meter/1000.0) + "km";
	}

	public static String distance2(Double meter){
		if(meter == null){
			return "0m";
		}
		if(meter < 1000.0){
			return meter.intValue() + "m";
		}

		return  meter / 1000 + "千米";
	}



	/**
	 * 四舍五入，保留小数
	 * @param number 需要四舍五入的小数
	 * @param newScale 保留小数的位数 （1，2，3）
	 * @return
	 */
	public static double decimal2Digits(double number, int newScale){
		BigDecimal bg = new BigDecimal(number);
		return bg.setScale(newScale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}


	public static void main(String[] args) {
		double distance = getDistance(116.41981507064698, 39.9123579804469,
				19.116881, 109.046939);
		System.out.println("距离" + distance / 1000 + "千米");
	}

}
